引用自 Kazma 的 Flipper Zero 宇宙最強攻略:30 天帶你從入門到入坑系列文
請注意,透過 Flipper Zero 所學到的技術與知識,主要目的是提升個人技術能力與資訊安全意識。我們強烈呼籲各位,不要將這些知識應用於任何違法活動。您有責任確保所學知識的合法用途。針對今天的主題,大家務必要注意以下幾點:
絕對不要測試不屬於自己的設備,或是未經授權的設備。
切勿測試您自己日常使用的或生活必需的裝置。
重放攻擊(Replay Attack)或是訊號模糊測試(Fuzzing Signals)有可能導致接收器與發射設備不同步,並可能造成損壞,後果須自行承擔。
雖說 Flipper Zero 可以使用 Sub-GHz 分析(Analyze)、讀取(Read),甚至可以模擬(Emulate)汽車遙控器的訊號,但這樣就代表我們可以透過 Flipper Zero 來破解遙控器嗎?
(門口那輛賓士,想試駕你很久了。)
這就要來說說 Sub-Ghz 的幾種不同的 Code (編碼)——遙控器發射給接收端的「控制訊號內容」,也就一串二進位的編碼,透過這個編碼,接收端才會知道控制器要執行「開門」、「關門」或是觸發某個功能,而常見的編碼有固定碼(Static Code)、滾動碼(Rolling Code)、學習碼(Learning Code)等幾種不同的編碼方式。
碼如其名,Static Code 的意思代表每次發射出去的訊號內容都是固定的,可以想像成一把鑰匙,不管是誰複製了這把鑰匙,都可以打對應的門,也因此固定碼是最容易被複製的編碼方式。
這訊號是一組事先定義好的位元序列(binary code),像是 00110101,接收端會比對這組序列與儲存的「授權碼」,如果吻合的話,就會執行相對應的功能。
常見的 Static Code 訊號的頻段有 315 MHz、433.92 MHz、868 MHz、915 MHz 等,而不同的遙控器品牌會使用不同的頻段,所以我們在使用 Flipper Zero 時,也需要先設定好對應的頻段才能收到訊號。
但光是有固定碼(Static Code)還不夠,因為編碼只是內容,我們還要想辦法把這個訊號發射出去,為了要把這個訊號發射出去,我們還需要使用「調變(Modulation)」的方法,把資料裝上高頻載波,讓天線有效地把訊號輻射出去。
那為什麼需要高頻載波呢?為什麼不能直接把訊號發射出去就好呢?
想像所有人都在同一個頻道上大喊「010101(要傳送的資料)」,彼此的聲音全部會互相干擾,導致大家都聽不懂對方在說什麼,所以我們可以把各自的資料放在不同的頻率(像 98.7 MHz、99.5 MHz 等),接收者只要轉到正確的頻道,就可以聽到對方在說什麼了。
還有一個原因是空氣中有很多低頻雜訊(電線、馬達、家電等電磁干擾),如果把資料搬到高頻段,就可以避免被雜訊干擾,這樣訊號可以更清楚地被傳送,能夠傳送的距離也會更遠。
調變有很多種方法,像是改振幅(AM/ASK/OOK)、改頻率(FM/FSK)、改相位(PSK)、或更進階(QAM/OFDM)。
其中 ASK(Amplitude Shift Keying)指的是用不同「振幅高度」代表不同的符號,最簡單的兩種振幅(高/低)代表 1/0,當然也可以拓展成更多級振幅來代表更多種符號(更多資訊)。
OOK(On-Off Keying)是 ASK 的一種特殊情況,指的是只有兩種振幅(開/關),分別代表 1/0:
而以 Sub-GHz 遙控器來說,設計者常選 OOK/ASK,原因是:
所以整個流程會是:
包絡檢波(envelope detection)」是無線電常見的一種解調方法。
相對於固定碼只要能成功複製,就能重播並使用,聽起來相當地不安全,滾動碼則是我們每次在按壓遙控器時,發射出來的「控制碼」都不一樣,當這個控制碼發射後,發射器會根據加密演算法,再滾動產生下一個碼,同樣地接收器在接受到控制碼後也會同步更新,只接受「符合演算法規則的下一組碼」。
透過這個加密演算法,就能夠有效防止重播攻擊(Replay Attack),因為即使攻擊者截取到控制碼,再模擬播送一次,接收器會拒絕,而且攻擊者也無法知道下一組控制碼是什麼,也就無法進行重播攻擊,。
可以想像成一次性密碼(OTP),用過一次就換下一個,舊的馬上作廢。
完整的流程會是這樣:
這是可能會想說,那萬一不小心在別的地方按了遙控器,接收器也沒接受到的狀況下,導致計數器不同步,那不就完蛋了嗎?
所以其實在滾動碼的設計中,會有幾個策略可以避免或有條件地容許這種狀況:
如果發生太多未同步的按鍵(超過容錯範圍),接收端可能要求「重做配對程序」或人工重置。
講到這裡應該不難推測,汽車遙控器通常會使用滾動碼(Rolling Code)的編碼方式,所以我們即使可以截取到控制碼,也無法進行重播攻擊,也就無法開門。
不過,如果我們可以找到某輛賓士的遙控器,並且可以截取到控制碼,那麼我們就可以使用 Flipper Zero 來模擬這個控制碼,並搭配上滾動碼的演算法,就可以製作出一把新的遙控器,來試駕了。